#ifndef AC_COMMON_MUTABLE_STRING_HPP_
#define AC_COMMON_MUTABLE_STRING_HPP_

#include <cstring>

#include "common/parm_string.hpp"

struct MutableString
{
    char* str;
    unsigned int size;

    MutableString()
        : str(0)
        , size(0)
    {
    }

    MutableString(char* psz)
        : str(psz)
        , size(strlen(str))
    {
    }

    MutableString(char* psz, unsigned int sz)
        : str(psz)
        , size(sz)
    {
    }

    bool empty() const
    {
        return 0 == size;
    }

    operator char * ()
    {
        return str;
    }

    operator ParmString() const
    {
        return ParmString(str, size);
    }

    char* begin() const
    {
        return str;
    }

    char* end() const
    {
        return str + size;
    }
};

static inline bool operator == (MutableString s1, MutableString s2)
{
    if (s1.size != s2.size)
        return false;
    else
        return memcmp(s1, s2, s1.size) == 0;
}

static inline bool operator == (const char* s1, MutableString s2)
{
    if (s1 == NULL)
        return s2.size == 0;
    return strcmp(s1, s2) == 0;
}

static inline bool operator == (MutableString s1, const char* s2)
{
    if (s2 == NULL)
        return s1.size == 0;
    return strcmp(s1, s2) == 0;
}

static inline bool operator != (MutableString s1, MutableString s2)
{
    if (s1.size != s2.size)
        return true;
    else
        return memcmp(s1, s2, s1.size) != 0;
}

static inline bool operator != (const char* s1, MutableString s2)
{
    if (s1 == NULL)
        return s2.size != 0;
    return strcmp(s1, s2) != 0;
}

static inline bool operator != (MutableString s1, const char* s2)
{
    if (s2 == NULL)
        return s1.size != 0;
    return strcmp(s1, s2) != 0;
}

#endif  // AC_COMMON_MUTABLE_STRING_HPP_
